package com.bstech.Tabelle;

import java.io.Serializable;
import java.util.List;
import java.util.Vector;

import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

import com.bstech.Classi.Common;
import com.bstech.Utils.*;
import com.bstech.assistance.R;

public class Impianti {
	public static String TABLE_NAME = "IMPIANTI";
	
	public static String ID_KEY = "ID";
	public static String ID_CLIENTE_KEY = "ID_CLIENTE";
	public static String ID_DESTINAZIONE_KEY = "ID_DESTINAZIONE";
	public static String CODICE_KEY = "CODICE";
	public static String NUMERO_KEY = "NUMERO";
	public static String DESCRIZIONE_KEY = "DESCRIZIONE";
	public static String NOTE_KEY = "NOTE";
	public static String PROGETTO_KEY = "PROGETTO";
	
	public static String CREATE_TABLE_QUERY = "CREATE TABLE IF NOT EXISTS "+ TABLE_NAME +"(" +
												ID_KEY+" integer primary key not null," +
												ID_CLIENTE_KEY+" integer not null," +
												ID_DESTINAZIONE_KEY+" integer not null," +
												CODICE_KEY+" integer not null," +
												NUMERO_KEY+" text null," +
												DESCRIZIONE_KEY+" text null," +
												NOTE_KEY+" text null," +
												PROGETTO_KEY+" text null);";
	
	public static void UpdateToVersion(SQLiteDatabase db, int from, int to )
	{
		for(int ver = from +1; ver<= to; ver++)
		{
//			switch(ver)
//			{
//			case 2:
//				db.executeSql("");
//				break;
//			case 3:
//				db.executeSql("");
//				break;
//			}
		}
	}
	public static boolean Insert(int ID, int IdCliente,int IdDestinazione, int Codice, String Numero, String Descrizione, String Note, String Progetto)
	{
		ContentValues cv = new ContentValues();
		
		cv.put(Impianti.ID_KEY, ID);
		cv.put(Impianti.ID_CLIENTE_KEY, IdCliente);
		cv.put(Impianti.ID_DESTINAZIONE_KEY, IdDestinazione);
		cv.put(Impianti.CODICE_KEY, Codice);
		cv.put(Impianti.NUMERO_KEY, Strings.CheckString(Numero));
		cv.put(Impianti.DESCRIZIONE_KEY, Strings.CheckString(Descrizione));
		cv.put(Impianti.NOTE_KEY, Strings.CheckString(Note));
		cv.put(Impianti.PROGETTO_KEY, Strings.CheckString(Progetto));
		
		return Common.db.Insert(Impianti.TABLE_NAME, null, cv);
	}	
	public static boolean Update(int ID, int IdCliente,int IdDestinazione, int Codice, String Numero, String Descrizione, String Note, String Progetto)
	{
		ContentValues cv = new ContentValues();
		
		cv.put(Impianti.ID_CLIENTE_KEY, IdCliente);
		cv.put(Impianti.ID_DESTINAZIONE_KEY, IdDestinazione);
		cv.put(Impianti.CODICE_KEY, Codice);
		cv.put(Impianti.NUMERO_KEY, Strings.CheckString(Numero));
		cv.put(Impianti.DESCRIZIONE_KEY, Strings.CheckString(Descrizione));
		cv.put(Impianti.NOTE_KEY, Strings.CheckString(Note));
		cv.put(Impianti.PROGETTO_KEY, Strings.CheckString(Progetto));
		
		return Common.db.Update(Impianti.TABLE_NAME, cv, Impianti.ID_KEY +" = " + Integer.toString(ID), null);
	}	
	public static boolean Exists(int idImpianto) {
		Cursor cursor = Common.db.query(Impianti.TABLE_NAME,new String[] { Impianti.ID_KEY }, Impianti.ID_KEY + "=" + Integer.toString(idImpianto), null, null, null, null);

		int count = 0;
		if (cursor != null) {
			count = cursor.getCount();
			cursor.close();
		}
		return (count > 0);
	}
	public static Impianto Select(int ID)
	{
		Cursor cursor = Common.db.query(Impianti.TABLE_NAME, new String[] {Impianti.ID_KEY,Impianti.ID_CLIENTE_KEY,Impianti.ID_DESTINAZIONE_KEY,Impianti.CODICE_KEY,Impianti.NUMERO_KEY,Impianti.DESCRIZIONE_KEY,Impianti.NOTE_KEY,Impianti.PROGETTO_KEY},
				Impianti.ID_KEY + "= " + Integer.toString(ID),
				null, null,null, null);

		Impianto ret = null;
				
		if(cursor != null )
		{
			if(cursor.moveToFirst())
				ret =  Select(cursor);
			cursor.close();
		}
		return ret;
	}
	public static List<Impianto> SelectAll(int IdCliente, int IdDestinazione)
	{
		Cursor cursor = Common.db.query(Impianti.TABLE_NAME, new String[] {Impianti.ID_KEY,Impianti.ID_CLIENTE_KEY,Impianti.ID_DESTINAZIONE_KEY,Impianti.CODICE_KEY,Impianti.NUMERO_KEY,Impianti.DESCRIZIONE_KEY,Impianti.NOTE_KEY,Impianti.PROGETTO_KEY},
				Impianti.ID_CLIENTE_KEY + "=" + Integer.toString(IdCliente) + " AND " + Impianti.ID_DESTINAZIONE_KEY + " = " + Integer.toString(IdDestinazione),
				null, null,null, 
				Impianti.DESCRIZIONE_KEY);
		
		List<Impianto> ret = new Vector<Impianto>();
		
		if(cursor != null)
		{
			while(cursor.moveToNext())
				ret.add(Select(cursor));
			cursor.close();
		}
		
		return ret;
	}
	private static Impianto Select(Cursor cursor)
	{
		Impianto ret = null;
		
		if(cursor != null && !cursor.isAfterLast())
		{	
			ret = new Impianto();
			
			ret.ID = cursor.getInt(0);
			ret.IdCliente = cursor.getInt(1);
			ret.IdDestinazione = cursor.getInt(2);
			ret.Codice = cursor.getInt(3);
			ret.Numero = cursor.getString(4);
			ret.Descrizione = cursor.getString(5);
			ret.Note = cursor.getString(6);
			ret.Progetto = cursor.getString(7);
		}
		return ret;
	}
	
	public static class Impianto implements Serializable
	{
		private static final long serialVersionUID = 156L;

		public Impianto(){}
		public int ID,IdCliente,IdDestinazione,Codice;
		public String Numero,Descrizione,Note,Progetto;
		
		public static List<Impianto> GetFromXml(String xml)
		{
			List<Impianto> ret = new Vector<Impianto>();
			
			if(xml !=null)
			{
				NodeList nodi = XmlParser.ParseNodes(xml, "IMPIANTO");
				if(nodi !=null)
				{
					int nodesCount = nodi.getLength();
					Impianto t = null;
					
					for(int i=0; i < nodesCount; i++)
					{
						t = ParseFromXmlNode(nodi.item(i));
						if(t != null)
							ret.add(t);
					}
					
					t = null;
					nodi = null;
				}
				else
					Log.e("Impianto.GetFromXml", "Errore durante il parse dei nodi, ritornato null");
			}
			else
				Log.e("Impianto.GetFromXml", "Parametro xml nullo");
			
			return ret;
		}
		private static Impianto ParseFromXmlNode(Node nodo) {
			Impianto ret = new Impianto();
			
			NodeList dettagli = nodo.getChildNodes();
			int detailsCount = dettagli.getLength();
			
			Element dettaglio = null;
			String nome = "";
			String valore = "";
			
			for(int i=0;i<detailsCount;i++)
			{
				try {
					if(dettagli.item(i).getNodeType() == Node.ELEMENT_NODE)
					{
						dettaglio = (Element)dettagli.item(i);
						nome = dettaglio.getNodeName();
						valore = dettaglio.getTextContent();
						
						if(nome.equals("ID"))
							ret.ID = Integer.parseInt(valore.trim());
						else if(nome.equals("CL03_CLIENTE_CL01"))
							ret.IdCliente = Integer.parseInt(valore.trim());
						else if(nome.equals("CL03_DESTINAZIONE_CL02"))
							ret.IdDestinazione = Integer.parseInt(valore.trim());
						else if(nome.equals("CL03_CODICE"))
							ret.Codice = Integer.parseInt(valore.trim());
						else if(nome.equals("CL03_NUMERO"))
							ret.Numero = valore.trim();
						else if(nome.equals("CL03_DESCRIZIONE"))
							ret.Descrizione = valore.trim();
						else if(nome.equals("CL03_NOTE"))
							ret.Note = valore.trim();
						else if(nome.equals("CL03_PROGETTO"))
							ret.Progetto = valore.trim();
						
					}
				} catch (Exception e) {
					Log.e("Impianto.ParseFromXmlNode", "Errore nel ciclo di assegnazione valori. Errore: " + e.toString());
					ret = null;
					break;
				}
			}
			
			dettaglio = null;
			dettagli = null;
			
			return ret;
		}
	}
	
	public static class ImpiantiAdapter extends  ArrayAdapter<Impianto>
	{
		Context context;
		List<Impianto> dataSource;
		
		public ImpiantiAdapter(Context context, List<Impianto> source) 
		{
			super(context, R.layout.combobox_item_selection, source);
			this.context = context;
			this.dataSource = source;
		}
		
		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			return ReturnViewItem( position, convertView, parent,false);
		}
		
		@Override
		public Impianto getItem(int position){
	       return dataSource.get(position);
		}
		
		@Override
	    public long getItemId(int position){
	       return position;
	    }
	
	    @Override
	    public View getDropDownView(int position, View convertView,ViewGroup parent) {
	    	return ReturnViewItem( position, convertView, parent,true);
	    }
	    
	    private View ReturnViewItem(int position, View convertView,ViewGroup parent, boolean isDropDown)
	    {
	    	View riga = convertView;
			ItemViewHolder holder;

			if (riga == null) {
				LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
				// creo un holder per gli oggetti in questa vista
				holder = new ItemViewHolder();
				
				riga = inflater.inflate(R.layout.combobox_item_selection, parent, false);
				holder.txtTesto = (TextView) riga.findViewById(R.id.combobox_item_selection_txtTesto);
				
				// e lo memorizzo nella vista
				riga.setTag(holder);
			} 
			else 
				holder = (ItemViewHolder) riga.getTag(); // mi ricarico l'holder degli oggetti

			holder.txtTesto.setText(dataSource.get(position).Descrizione);
			
			return riga;
	    }

		private class ItemViewHolder {
			TextView txtTesto;
		}
		
		public int getItemPosition(int itemID)
		{
			if(this.dataSource == null || this.dataSource.size() == 0) return -1;
			
			int ret = -1;
			int size = this.dataSource.size();
			
			Impianto p = null;
			for(int i=0; i < size; i++ )
			{
				p = this.dataSource.get(i);
				if(p.ID == itemID)
				{
					ret = i;
					break;
				}
			}
			
			p = null;
			return ret;
		}
	}
}
